package main

import (
	"container/list"
)

/*
输入：

["CQueue","appendTail","deleteHead","deleteHead"]
这一行表示每一行代码的操作

[[],[3],[],[]]
表示需要被操作的对象

举例：
CQueue 表示新建一个CQueue对象，对应的结果为[]。
appendTail 表示执行一个appendTail()操作，对应要被操作的元素为3
deleteHead 表示执行一个deleteHead操作，对应的结果为[]

以上的输入其实是一个代码执行的步骤描述与其对应结果或操作。
并不是说，上面的“输入”表示的输入程序验证的数据.
*/

type CQueue struct {
	stack1, stack2 *list.List
}

func main() {
	stack1 := []string{"CQueue", "appendTail", "deleteHead", "deleteHead"}
	stack2 := list.List{{}, {3}, {}, {}}
	for i, i2 := range stack1 {
		if i2 == "CQueue" {
			obj = CQueue(stack2[i])
		}
	}
}

func Constructor() CQueue {
	return CQueue{
		stack1: list.New(),
		stack2: list.New(),
	}
}

func (this *CQueue) AppendTail(value int) {
	this.stack1.PushBack(value)
}

func (this *CQueue) DeleteHead() int {
	// 如果第二个栈为空
	if this.stack2.Len() == 0 {
		for this.stack1.Len() > 0 {
			this.stack2.PushBack(this.stack1.Remove(this.stack1.Back()))
		}
	}
	if this.stack2.Len() != 0 {
		e := this.stack2.Back()
		this.stack2.Remove(e)
		return e.Value.(int)
	}
	return -1
}

/**
 * Your CQueue object will be instantiated and called as such:
 * obj := Constructor();
 * obj.AppendTail(value);
 * param_2 := obj.DeleteHead();
 */
